#include "exception_demo.h"

/* 模拟异常函数 */
UINT32 get_exc1(){
    // 访问非法地址，会产生异常
    UINT32 res = *(UINT32 *)(0xffffffff);
    printf("Enter get exception 1 ... %u\n", res);
    return res;
}

UINT32 get_exc2(){
    printf("Enter get exception 2 ...\n");
    return get_exc0();
}

UINT32 get_exc3(){
    printf("Enter get exception 3 ...\n");
    return get_exc1();
}

/* 任务测试入口函数，创建一个会发生异常的任务 */
UINT32 exception_entry(VOID){
    UINT32 ret, tid;
    TSK_INIT_PARAM_S param = { 0 };

    /* 锁任务调度，防止新创建的任务比本任务高而发生调度 */
    LOS_TaskLock();
    // 任务参数
    param.pfnTaskEntry = (TSK_ENTRY_FUNC)get_exc3;
    param.usTaskPrio = 4;
    param.pcName = "task_exc";
    param.uwStackSize = 4 * 0x400;
    /* 创建高优先级任务，由于锁任务调度，任务创建成功后不会马上执行 */
    ret = LOS_TaskCreate(&tid, &param);
    if (ret != LOS_OK) {
        printf("task exception create Failed, errno = 0x%x\n", ret);
    }
    /* 解锁任务调度，此时会发生任务调度，执行就绪队列中最高优先级任务 */
    LOS_TaskUnlock();
  
    return ret;
}
